object Demo10Func3 {
  // 以函数作为参数 应用
  def main(args: Array[String]): Unit = {
    val arr: Array[Int] = Array[Int](1, 2, 3, 4, 5, 6, 7)
    // 遍历数组
    /**
     * Java的思想
     * for(int i=0;i<arr.length;i++){
     * System.out.println(arr[i]);
     * }
     */
    // Scala的方式 类似Java中的增强for（for-each）
    for (elem <- arr) {
      println(elem)
    }

    /**
     * foreach方法可以接收一个函数f
     * 函数f的类型：   Int => U
     * Int： arr中的每一个元素的类型是 Int
     * U：相当于Unit 表示没有返回值
     *
     * println函数： Any => Unit
     */
    arr.foreach(println) // foreach 会将arr中的每个元素作为参数 传给println方法

    println("#" * 30)

    // 将arr中的每个元素扩大一倍 并构建一个新的arr2
    // 用Java的思想做
    var count: Int = 0
    val arr2: Array[Int] = new Array[Int](arr.length)
    while (count < arr.length) {

      arr2(count) = arr(count) * 2

      count += 1
    }
    // mkString 可以指定一个分隔符 将arr2中的每个元素与分隔符拼接 返回一个 字符串
    // 类似Python中的join方法
    println(arr2.mkString(","))
    println("#" * 30)

    // 以函数式编程的思想来实现
    val arr3: Array[Int] = new Array[Int](arr.length)

    var count2: Int = 0
    arr.foreach((elem: Int) => {
      arr3(count2) = elem * 2
      count2 += 1
    })
    println(arr3.mkString("|"))
    println("#" * 30)

    /**
     * map方法也需要接收一个函数f：
     * 函数f：    Int => B
     * Int： arr中的每一个元素的类型是 Int
     * B： 表示返回值类型由自己指定
     *
     * map 和 foreach最大的区别在于 有无返回值
     */
    val arr4: Array[Int] = arr.map((elem: Int) => {
      elem * 2
    })
    println(arr4.mkString("#"))
    // 简化
    println(arr.map(_ * 2).mkString("#"))
    println(arr.map(_ * 3).mkString("#"))
    println(arr.map(_ * 4).mkString("#"))
    println(arr.map(_ * 1.5).mkString("#"))


  }

}
